package part01_七大原则.p05_开闭原则;

/**开闭原则：
 * 1-一个软件实体类，模块和函数应该对扩展开放(对提供方)，对修改关闭(对使用方)，用抽象构建框架，用实现扩展细节
 * 2-当软件需要变化时，尽量通过扩展软件实体的行为来实现变化，而不是通过修改已有的代码来实现变化
 * 3-编程中遵循其他原则，以及使用设计模式的目的就是遵循开闭原则
 * @ClassName: Ocp01
 * @Author: AllenSun
 * @Date: 2019/12/3 21:40
 */
public class Ocp01 {
    public static void main(String[] args) {
        GraphicEditor graphicEditor = new GraphicEditor();
        graphicEditor.drawShape(new Rectangle());
        graphicEditor.drawShape(new Circle());
        graphicEditor.drawShape(new Triangle());
    }
}

//这是一个用于绘画的类（使用方）
class GraphicEditor{
    public void drawShape(Shape shape){
        if(shape.m_type==1){
            drawRectangle(shape);
        } else if(shape.m_type==2){
            drawCircle(shape);
        } else if(shape.m_type==3){
            drawTriangle(shape);
        }
    }

    public void drawRectangle(Shape r){
        System.out.println("绘制矩形");
    }
    public void drawCircle(Shape c){
        System.out.println("绘制圆形");
    }
    public void drawTriangle(Shape t){
        System.out.println("绘制三角形");
    }
}

//图形类，是父类，具体是什么图形交给继承类去实现
class Shape{
    int m_type;
}

//实现类，正方形
class Rectangle extends Shape{
    Rectangle(){
        super.m_type=1;
    }
}

//实现类，圆形
class Circle extends Shape{
    Circle(){
        super.m_type=2;
    }
}

//实现类，三角形
class Triangle extends Shape{
    Triangle(){
        super.m_type=3;
    }
}
